#ifndef BLOQUEHASH_H_
#define BLOQUEHASH_H_

#include <list>
#include "RegistroHash.h"
#include "../BloqArch/IBloque.h"
#include "../common/Resultados.h"
#include "../common/IImprimible.h"


class BloqueHash: public IBloque, public IImprimible {
private:
	unsigned int _tamDispersion;
	std::list<RegistroHash> _lRegistros;

	Resultado buscarPosicion(const RegistroHash& reg, std::list<RegistroHash>::iterator &it);

	void ImprimirEn(std::ostream& out) const;

public:
	BloqueHash();
	virtual ~BloqueHash();

	// Overflow, underflow, etc.
	Resultado getEstado() const;
	
	unsigned int getTamDispersion() const;
	void setTamDispersion(unsigned int t);

	// El tamaño en bytes de todo el bloque
	unsigned int getSize() const;

	Resultado agregarRegistro(RegistroHash reg);
	Resultado quitarRegistroPorId(const RegistroHash& reg);
	Resultado modificarRegistroPorId(const RegistroHash& reg);
	Resultado buscarRegistroPorId(const RegistroHash& reg, RegistroHash &regEncontrado) const;

	// Elimina todo el contenido del bloque
	void clear();

	// IBloque
	unsigned int serialize(char* &arrBytes);
	void deSerialize(char* arrBytes);

	// Es horrible esto, pero no tengo tiempo para cambiar todo
	int getCantElementos() const;
	RegistroHash getRegAt(unsigned int pos) const;

	void swap(BloqueHash& bh);
};

#endif /* BLOQUEHASH_H_ */
